package com.skyhigh.web.webservice.controllers;

import java.util.Calendar;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.support.SessionStatus;

import com.skyhigh.web.webservice.domain.Carga;
import com.skyhigh.web.webservice.domain.CargaList;
import com.skyhigh.web.webservice.domain.Usuario;
import com.skyhigh.web.webservice.services.BodegaService;
import com.skyhigh.web.webservice.services.CargaService;
import com.skyhigh.web.webservice.services.ClienteService;
import com.skyhigh.web.webservice.services.DocumentoService;
import com.skyhigh.web.webservice.services.PaisService;
import com.skyhigh.web.webservice.services.TipoMovimientoService;
import com.skyhigh.web.webservice.services.TransportistaService;

@Controller
public class CargasController {
	
	@Autowired
	private CargaService service;
	@Autowired
	private PaisService paisService;
	@Autowired
	private TipoMovimientoService tipoMovimientoService;
	@Autowired
	private TransportistaService transportistaService;
	@Autowired
	private BodegaService bodegaService;
	@Autowired
	private DocumentoService documentoService;
	@Autowired
	private ClienteService clienteService;
	
	protected final Log logger = LogFactory.getLog(getClass());
	
	@RequestMapping(value="/buscarCargas.htm", method = RequestMethod.GET)
	public String desplegarFormularioBusquedaCargas(ModelMap model){	
		
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargas";
	}
	
	@RequestMapping(value="/buscarCargas.htm", method = RequestMethod.POST)
	public String listarBusquedaCargas(ModelMap model, 
			@ModelAttribute("idCarga") Integer idCarga, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista,			
			BindingResult result, SessionStatus status){
		
		String query = "FROM Carga WHERE idCarga is not Null ";			
		if(idCarga != 0)
			query = query + "AND idCarga = " + idCarga.toString();
		else
			query = query + "AND idCarga LIKE '%' ";
		
		if(idPaisProcedencia != 0)
			query = query + "AND idPaisProcedencia = " + idPaisProcedencia.toString();
		else
			query = query + "AND idPaisProcedencia LIKE '%' ";
		
		if(idPaisDestino != 0)
			query = query + "AND idPaisDestino = " + idPaisDestino.toString();
		else
			query = query + "AND idPaisDestino LIKE '%' ";
		
		if(idBodega != 0)
			query = query + "AND idBodega = " + idBodega.toString();
		else
			query = query + "AND idBodega LIKE '%' ";
			
		if(idTipoMovimiento != 0)
			query = query + "AND idTipoMovimiento = " + idTipoMovimiento.toString();
		else
			query = query + "AND idTipoMovimiento LIKE '%' ";
		
		if(idDocumento != 0)
			query = query + "AND idDocumento = " + idDocumento.toString();
		else
			query = query + "AND idDocumento LIKE '%' ";
		
		if(idCliente != 0)
			query = query + "AND idCliente = " + idCliente.toString();
		else
			query = query + "AND idCliente LIKE '%' ";
		
		if(idTransportista != 0)
			query = query + "AND idTransportista = " + idTransportista.toString();
		else
			query = query + "AND idTransportista LIKE '%' ";
		
							
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", service.obtenerObjetosByConsulta(query));		
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargas";
	}
	
	
	@RequestMapping(value="/editarCarga.htm", method = RequestMethod.GET)
	public String editarCarga(ModelMap model, @ModelAttribute("idCarga") Integer idCarga){
		
		model.addAttribute("carga", service.obtenerObjeto(idCarga));	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "editarCarga";
	}
	
	
	@RequestMapping(value="/guardarCargaExistente.htm", method = RequestMethod.POST)
	public String guardarCargaExistente(ModelMap model, 
			@ModelAttribute("idCarga") Integer idCarga, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("volumen") Double volumen,
			BindingResult result, SessionStatus status){
		
		
		Carga carga = service.obtenerObjeto(idCarga);
		carga.setVolumen(volumen);
		carga.setIdPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		carga.setIdPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		carga.setIdBodega(bodegaService.obtenerObjeto(idBodega));
		carga.setIdTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		carga.setIdDocumento(documentoService.obtenerObjeto(idDocumento));
		carga.setIdCliente(clienteService.obtenerObjeto(idCliente));
		carga.setIdTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.actualizar(carga);
		
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargas";
	}
	
	@RequestMapping(value="/crearCarga.htm", method = RequestMethod.GET)
	public String desplegarFormularioCrearCargas(ModelMap model){	
		
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "crearCarga";
	}
	
	@RequestMapping(value="/guardarCargaNueva.htm", method = RequestMethod.POST)
	public String guardarCargaNueva(ModelMap model, 			
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("volumen") Double volumen,
			BindingResult result, SessionStatus status){
		
		
		Carga carga = new Carga();
		carga.setFechaIngreso(Calendar.getInstance().getTime());
		carga.setVolumen(volumen);
		carga.setIdPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		carga.setIdPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		carga.setIdBodega(bodegaService.obtenerObjeto(idBodega));
		carga.setIdTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		carga.setIdDocumento(documentoService.obtenerObjeto(idDocumento));
		carga.setIdCliente(clienteService.obtenerObjeto(idCliente));
		carga.setIdTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.agregar(carga);
		
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargas";
	}
	
	@RequestMapping(value="/eliminarCarga.htm", method = RequestMethod.GET)
	public String eliminarCarga(ModelMap model, @ModelAttribute("idCarga") Integer idCarga){	
		
		service.eliminar(idCarga);
		
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargas";
	}
}
